ensure correct behavioron Windows for invalid file names
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Tue, 18 Feb 2025 09:22:50 +0000 (10:22 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Wed, 19 Feb 2025 13:12:37 +0000 (13:12 +0000)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/discovery.cpp
src/libsync/syncengine.cpp
test/testlocaldiscovery.cpp

index 1e325d39d22807c62f27b91047d948485ac8198e..1cd9f6f3006f2dffb861351134cdd5c9c65c28fb 100644 (file)
@@ -292,7 +292,11 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
                                             || excluded == CSYNC_FILE_EXCLUDE_LEADING_AND_TRAILING_SPACE;
 
     const auto leadingAndTrailingSpacesFilesAllowed = !_discoveryData->_shouldEnforceWindowsFileNameCompatibility || _discoveryData->_leadingAndTrailingSpacesFilesAllowed.contains(_discoveryData->_localDir + path);
+#if defined Q_OS_WINDOWS
+    if (hasLeadingOrTrailingSpaces && leadingAndTrailingSpacesFilesAllowed) {
+#else
     if (hasLeadingOrTrailingSpaces && (wasSyncedAlready || leadingAndTrailingSpacesFilesAllowed)) {
+#endif
         excluded = CSYNC_NOT_EXCLUDED;
     }
 
@@ -2282,7 +2286,8 @@ void ProcessDirectoryJob::setupDbPinStateActions(SyncJournalFileRecord &record)
 void ProcessDirectoryJob::maybeRenameForWindowsCompatibility(const QString &absoluteFileName,
                                                              CSYNC_EXCLUDE_TYPE excludeReason)
 {
-    if (!_discoveryData->_shouldEnforceWindowsFileNameCompatibility) {
+    const auto leadingAndTrailingSpacesFilesAllowed = !_discoveryData->_shouldEnforceWindowsFileNameCompatibility || _discoveryData->_leadingAndTrailingSpacesFilesAllowed.contains(absoluteFileName);
+    if (leadingAndTrailingSpacesFilesAllowed) {
         return;
     }
 
index 25e6bf414782f982da7fc68e5ba1cf6d93085444..515417084a78e9f850c603654fcddb59b89704fc 100644 (file)
@@ -688,6 +688,10 @@ void SyncEngine::startSync()
         _shouldEnforceWindowsFileNameCompatibility = true;
         _discoveryPhase->_shouldEnforceWindowsFileNameCompatibility = _shouldEnforceWindowsFileNameCompatibility;
     }
+#if defined Q_OS_WINDOWS
+    _shouldEnforceWindowsFileNameCompatibility = true;
+    _discoveryPhase->_shouldEnforceWindowsFileNameCompatibility = _shouldEnforceWindowsFileNameCompatibility;
+#endif
 
     // Check for invalid character in old server version
     QString invalidFilenamePattern = _account->capabilities().invalidFilenameRegex();
index 43a624eaa352e11fdf57a9937569ff2d3cf7cf44..87bca0cdf1731043e7ce02334e786f8247922f3d 100644 (file)
@@ -418,14 +418,14 @@ private slots:
         fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, {QStringLiteral("foo"), QStringLiteral("bar"), QStringLiteral("bla"), QStringLiteral("A/foo"), QStringLiteral("A/bar"), QStringLiteral("A/bla")});
         QVERIFY(fakeFolder.syncOnce());
 
-#if defined Q_OS_WINDOWS
-        QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::Success);
-        QCOMPARE(completeSpy.findItem(extraFileNameWithSpaces)->_status, SyncFileItem::Status::Success);
+#if !defined Q_OS_WINDOWS
+        QCOMPARE(completeSpy.findItem(QStringLiteral("foo"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("bar"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("bla"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("A/foo"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("A/bar"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("A/bla"))->_status, SyncFileItem::Status::Success);
+        QCOMPARE(completeSpy.findItem(QStringLiteral("with spaces"))->_status, SyncFileItem::Status::Success);
 #endif
     }
 
@@ -605,9 +605,11 @@ private slots:
 
         QVERIFY(fakeFolder.syncOnce());
 
+#if !defined Q_OS_WINDOWS
         auto expectedState = fakeFolder.currentLocalState();
         qDebug() << expectedState;
         QCOMPARE(fakeFolder.currentRemoteState(), expectedState);
+#endif
     }
 
     void testBlockInvalidMtimeSyncRemote()